#include <iostream>
using namespace std;

class A {
public:
    void hello() {
        cout << "Hello" << endl;
    }
    void world() {
        cout << "World" << endl;
    }

    int add(int x, int y) {
        return x + y;
    }
    int sub(int x, int y) {
        return x - y;
    }
};

// 定义 成员 函数指针 类型 : 指向类成员函数的指针类型
typedef void(A::*PF)();

// 必须通过类的实例（对象或指针）才能调用（需要 this 指针）
// 声明时必须带 &类名::函数名 格式
// 调用时必须使用 .*（对象）或 ->*（指针）运算符
// 不能指向静态成员函数（静态成员函数用普通函数指针即可）

// 简单说，这个 typedef 是给 " 类 A 的无参 void 成员函数指针 " 起了个别名 PF，
// 让这种指针的声明和使用更简洁

typedef int(A::*cf)(int x , int y);

int main() {
    A obj;

    // 声明指针并指向具体成员函数
    PF func_ptr = &A::hello;  // 注意语法：&类名::函数名

    // 调用方式（必须通过对象/对象指针）
    (obj.*func_ptr)();  // 输出 Hello（使用对象）

    A* p = &obj;
    (p->*func_ptr)();  // 输出 Hello（使用对象指针）

    // 可以切换指向的函数
    func_ptr = &A::world;
    (obj.*func_ptr)();  // 输出 World


    A ret;
    // 声明指针并指向具体成员函数
    cf func = &A::add;
    // 调用成员函数
    cout << (ret.*func)(10,29) << endl;

    func = &A::sub;
    cout << (ret.*func)(10,29) << endl;


    return 0;
}